<?php

/**
 * Parametre
*/
class Parametre extends CI_Model
{
	const TABLE_PARAMETRE				= 'parametre';
	const ID_PARAMETRE					= 'IDParam';
	const LIBELLE_PARAMETRE				= 'LibelleParam';
	const VALEUR_PARAMETRE 				= 'ValeurParam';

	/**
	 * @var integer
	 */
	private $id;

	/**
	 * @var string
	 */
	private $libelle;

	/**
	 * @var string
	 */
	private $valeur;

	
	public function __construct()
	{
		parent::__construct();
	}

	public function count($where = array())
	{
		return (int) $this->db->where($where)
						  ->count_all_results(Parametre::TABLE_PARAMETRE);
	}
	
	/**
	 * Fonctions permettant de trouver tous les parametres
	 * @return array Un tableau de parametre.
	 */
	public static function findAll($where = null)
	{
		$CI = get_instance();

		$CI->load->database('db_adc', true);
		 
		$resultat = $CI->db	->select(self::ID_PARAMETRE.','.self::LIBELLE_PARAMETRE.','.self::VALEUR_PARAMETRE)
							->from(self::TABLE_PARAMETRE)
							->get()
							->result_array();
		
		$parametres = array();
			
		if(!empty($resultat))
		{
			foreach($resultat as $r)
			{
				$parametre = new Parametre();
				$parametre->setId($r[self::ID_PARAMETRE]);
				$parametre->setLibelle($r[self::LIBELLE_PARAMETRE]);
				$parametre->setValeur($r[self::VALEUR_PARAMETRE]);
					
				$parametres[] = $parametre;
			}
		}
			
		return $parametres;				 
		
	}
	
	/**
	 * Fonction permettant de récupérer un parametre en fonction de son libelle
	 * @param string $libelle Libelle du parametre
	 * @return string $valeur
	 */
	public static function findByLibelle($libelle)
	{
		$CI = get_instance();
		
		$CI->load->database('db_adc', true);
		
		$resultat = $CI->db	->select(self::ID_PARAMETRE.','.self::LIBELLE_PARAMETRE.','.self::VALEUR_PARAMETRE)
		->from(self::TABLE_PARAMETRE)
		->where(self::LIBELLE_PARAMETRE, $libelle)
		->get()
		->result_array();
			
		return $resultat[0][self::VALEUR_PARAMETRE];
	}

	/**
	 * Fonction permettant de récupérer un parametre en fonction de son identifiant
	 * @param integer $id identifiant du parametre
	 * @return Parametre
	 */
	public static function findById($id)
	{
		$CI = get_instance();
		 
		$CI->load->database('db_adc', true);
		 
		$resultat = $CI->db	->select(self::ID_PARAMETRE.','.self::LIBELLE_PARAMETRE.','.self::VALEUR_PARAMETRE)
		->from(self::TABLE_PARAMETRE)
		->where(self::ID_PARAMETRE, $id)
		->limit(1)
		->get()
		->result_array();
		 
		if(!empty($resultat))
		{
			$parametre = new Parametre();
			$parametre->setId($r[self::ID_PARAMETRE]);
			$parametre->setLibelle($r[self::LIBELLE_PARAMETRE]);
			$parametre->setValeur($r[self::VALEUR_PARAMETRE]);

			return $parametre;
		}
		return false;
	}
	
	/**
	 * Fonction permettant de modifier un parametre
	 * @param int $id id du parametre
	 * @param string $valeur valeur du parametre
	 * @return true ou false
	 */
	public static function modifyParametre($id, $valeur)
	{
		$CI = get_instance();
		 
		$CI->load->database('db_adc', true);
	
		$CI->db->set(self::VALEUR_PARAMETRE, $valeur);
		 
		$CI->db->where(self::ID_PARAMETRE, (int)$id);
	
		return $CI->db->update(self::TABLE_PARAMETRE);
	}
	
	/**
	 * Permet de vérifier le formulaire de modification des parametres
	 * @param String[] $parametres
	 * @return boolean
	 */
	public static function check($parametres)
	{
		$CI =& get_instance();
		$message = '';
		$retour = true;
		
		for( $i = 0; $i < 7; $i++)
		{
			if($i != 1 && !ctype_digit($parametres[$i]))
			{
    			$message .= "<br>La valeur du champ ".($i+1)." doit être un nombre entier.";
    			$retour = false;
    		}
		}
		if(!is_numeric($parametres[1]))
		{
			$message .= "<br>Le nombre de poinst maximums doit être un nombre.";
			$retour = false;
		}			
		for( $i = 7; $i < 11; $i++)
		{
			if(!verif($parametres[$i],'date'))
			{
    			$message .= "<br>La valeur du champ ".($i+1)." doit être de la forme jj/mm/aaaa.";
    			$retour = false;
    		}
		}
		
		if(isLater($parametres[7], $parametres[8]) != 1)
		{
    		$message .= "<br>La date du semestre 1 doit être antérieure à la date du semestre 2";
    		$retour = false;
    	}
		if(isLater($parametres[9], $parametres[10]) != 1)
		{
    		$message .= "<br>La date du semestre 3 doit être antérieure à la date du semestre 4";
    		$retour = false;
    	}
		$enseignants = Enseignant::findAll();
		$enseignantOk = false;
		foreach($enseignants as $enseignant)
		{
			if($enseignant->getLogin() == $parametres[11])
				$enseignantOk = true;
		}
		if(!$enseignantOk)
		{
    		$message .= "<br>Login de l'enseignant incorrect.";
    		$retour = false;
    	}
		$CI->session->set_flashdata('erreurParametre', $message);
		return $retour;
	}

	
	/**
	 * Get id
	 *
	 * @return integer
	 */
	public function getId()
	{
		return $this->id;
	}

	/**
	 * Set id
	 *
	 * @param integer $id
	 * @return integer
	 */
	public function setId($id)
	{
		$this->id = $id;
	}

	/**
	 * Set libelle
	 *
	 * @param string $libelle
	 * @return string
	 */
	public function setLibelle($libelle)
	{
		$this->libelle = $libelle;
	}

	/**
	 * Get libelle
	 *
	 * @return string
	 */
	public function getLibelle()
	{
		return $this->libelle;
	}

	/**
	 * Set valeur
	 *
	 * @param string $valeur
	 * @return string
	 */
	public function setValeur($valeur)
	{
		$this->valeur = $valeur;
	}

	/**
	 * Get valeur
	 *
	 * @return string
	 */
	public function getValeur()
	{
		return $this->valeur;
	}
}
